class AppliedAccount < ActiveRecord::Base
  CODE_MIN_LENGTH = 4
  CODE_MAX_LENGTH = 31
  CODE_FORMAT_REGEX = /^[a-zA-Z0-9\-_]*$/

  validates_presence_of :code, :message => 'は必須です'
  validates_uniqueness_of :code, :message => 'は既に登録されています'
  validates_length_of :code, :minimum => CODE_MIN_LENGTH, :message => "は%d文字以上で入力してください"
  validates_length_of :code, :maximum => CODE_MAX_LENGTH, :message => "は%d文字以内で入力してください"
  validates_format_of :code, :message => 'は数字orアルファベットor記号で入力してください', :with => CODE_FORMAT_REGEX

  validates_presence_of :email, :message => 'は必須です'
  validates_length_of :email, :maximum => 50, :message => 'は50桁以内で入力してください'
  validates_format_of :email, :message => 'は正しい形式で登録してください', :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/

  validates_length_of :password, :minimum => 4, :message =>'は4文字以上で入力してください'
  validates_length_of :password, :maximum => 40, :message =>'は50文字以内で入力してください'
  validates_format_of :password, :message =>'は数字orアルファベットor記号で入力してください', :with => /^[a-zA-Z0-9!#\$%&'()*+,-.\/;:<=>?@\[\]\\^_`~{|}]*$/
  validates_confirmation_of :password, :message => 'は確認用パスワードと一致しません'

  validates_presence_of :password_confirmation, :message => 'は必須です'

  class << self
    HUMANIZED_ATTRIBUTE_KEY_NAMES = {
      "code" => CUSTOM_RITERAL[:login_account],
      "email" => "メールアドレス",
      "password" => "パスワード",
      "password_confirmation" => "確認用パスワード"
    }
    def human_attribute_name(attribute_key_name)
      HUMANIZED_ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
    end
  end

  def validate
    errors.add(:code, "は既に登録されています") if account = Account.find_by_code(code)
    errors.add(:email, "は既に登録されています") if account = Account.find_by_email(email)
  end

  def before_save
    require 'uuidtools'
    self.onetime_code = UUID.random_create.to_s
    self.password = Digest::SHA1.hexdigest("#{SHA1_DIGEST_KEY}--#{self.password}--")
    self.name = self.code
  end

  # ユーザID(code)入力チェック
  def self.check_code code
    return "#{CODE_MIN_LENGTH}文字以上入力してください" if code and code.length < CODE_MIN_LENGTH
    return "#{CODE_MAX_LENGTH}文字以内で入力してください" if code and code.length > CODE_MAX_LENGTH
    return "英数もしくは-(ハイフン)、_(アンダーバー)のみで入力してください" unless code =~ CODE_FORMAT_REGEX
    (Account.find_by_code(code) or AppliedAccount.find_by_code(code)) ? "既に同一のユーザIDが登録されています" : "登録可能です"
  end
end
